770
23509
Mam listę czasów w sekundach, takich jak:
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
Dla każdego okna o długości 2 sekund, zaczynającego się od drugiej granicy, chciałbym wyświetlić listę wszystkich czasów, które mieszczą się w 2-sekundowym oknie. Więc dla powyższego przykładu będzie to:
[0,10218048, 1,20851996, 1,46800021, 1,73429061]
[1,20851996, 1,46800021, 1,73429061, 2,71525848]
[2,71525848, 3,14781922, 3,63637958]
[3.14781922, 3.63637958]
[5,11147358, 5,97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352]
[7,65215123, 7,86108352, 8,52988247, 8,83068894]
[8,52988247, 8,83068894]
[10,07690977]
[10,07690977, 11,5386728]
[11,5386728, 12,01214112, 12,13307653]
[12.01214112, 12.13307653]
Ogólnie długość okna może być inna niż 2.
Jak możesz to robić? 
Myślę, że miałeś na myśli przyrost oparty na „Dla każdego okna o długości 2 sekund zaczynając od drugiej granicy”, a nie nakładanie się. W przypadku interwałów dwusekundowych jest tak samo, ale ponieważ chcesz zmieniać długość, jedna sekunda nakładania będzie wynosić 0-3, 2-5, 4-7, ale przyrost oznaczałby 0-3, 1-4, 2- 5. Jednak interesujące było znalezienie rozwiązań dla obu na wszelki wypadek.
Zakładając, że L jest posortowane i wszystkie elementy są dodatnie, a drugie przedziały zaczynają się od liczb całkowitych, możemy użyć tej metody:
import matematyki
z kolekcji import defaultdict
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
my_ranges = defaultdict (lista)
interwał_szerokość = 2
dla xw L:
górna_granica = math.ceil (x)
dolna_graniczna = górna_graniczna - szerokość_przerwa
Lower_bound = max (0, lower_bound)
dla y w zakresie (dolna_granica, górna_granica):
my_ranges [y] .append (x)
dla sortowanych (my_ranges):
print (my_ranges [a])
Nie wiem, czy chcesz sprawdzić, czy są jakieś puste zakresy. Ale defaultdict wypisuje również puste zakresy, jeśli chcesz. Użyj tego wiersza zamiast „for a in sort”:
for a in range (min (my_ranges), max (my_ranges) + 1):
Jeśli chcesz zakresy 0-3, 2-5, 4-7, to działa:
import matematyki
z kolekcji import defaultdict
L = [0,10218048, 1,20851996, 1,46800021, 1,73429061, 2,71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
interwał_szerokość = 2
my_ranges_2 = defaultdict (lista)
dla xw L:
zdecydowanie_in = (x // (szerokość_zakresu - 1)) * (szerokość_zakresu - 1) # najniższa wielokrotność szerokości_zakresu poniżej x zawsze będzie w
#print („Dodawanie”, x, „do”, zdecydowanie_in)
my_ranges_2 [zdecydowanie_in] .append (x)
if x  = 0: # na przykład, jeśli x wynosi 2,3 i mamy 0,3 2,5 itd. ... musimy przechwycić ten zduplikowany przypadek. Zakładam, że długości okien są liczbami całkowitymi, a jeśli nie, mamy dużo więcej do zrobienia, ponieważ liczba może znajdować się w więcej niż jednej tablicy. Być może moglibyśmy mieć pętlę while, zwiększając o (szerokość_zakresu - 1)
#print ("++ Dodawanie", x, "do", zdecydowanie_in - szerokość_zakresu + 1)
my_ranges_2 [zdecydowanie_in - szerokość_zakresu + 1] .append (x)
dla sortowanego (my_ranges_2):
print (a, my_ranges_2 [a])
# print (my_ranges_2 [a])
Podejrzewam, że są pewne szczegóły, o których zapomniałem, ale mam nadzieję, że możesz zmienić wartość interval_width w zależności od potrzeb, aby upewnić się, że mój kod działa zgodnie z oczekiwaniami, i daj mi znać, czego dokładnie potrzebujesz.
|
Możliwe rozwiązanie, które mogę zaproponować, jest „wydajne” w tym sensie, że przechodzi przez dane wejściowe tylko raz i nie ma żadnych zależności. Koszt oczywiście polega na tym, że jest napisany w czystym Pythonie (może być bardziej zoptymalizowany kod) i że wprowadza więcej zmiennych śledzenia, aby zapobiec powtórzeniom (a zatem jest mniej pythonowy).
def slide_window (data, duration, start = 0, overlap = 1):
wynik = []
data_idx = 0
result_idx = 0
górna = początek + czas trwania
niższy = start
next_lower = upper - nakładają się
# wewnętrzny pomocnik do uzupełniania pustych list wewnętrznych do naszego punktu wstawiania i wstawiania
def pad_and_append (at):
while len (wynik) <= o:
result.append ([])
wynik [at] .append (dane [data_idx])
# iteruje przez dane wejściowe
while data_idx  a:
jeśli x  = l [0]) & (L  = i) & (L